Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Feb 12, 2025

🧷 문제 링크

https://www.acmicpc.net/problem/11967

🧭 풀이 시간

60+분

👀 체감 난이도

✏️ 문제 설명

  • $N \times N$ 격자에 (1,1)에만 불이 켜져있다.
  • 각 칸의 불은 스위치를 이용해 켤 수 있고, 스위치의 정보는 (a,b,x,y)로 이루어져 (a,b)칸에 도달하면 (x,y)칸의 불을 켤 수 있다는 의미이다.
  • (1,1)에서 출발하여 상하좌우의 불이 켜져있는 방으로만 이동 가능할 때, 켤 수 있는 불의 최대 개수를 구해보자.

🔍 풀이 방법

  • 격자 칸을 1차원으로 압축하고, 각 스위치를 간선으로 갖는 그래프를 만들어 주었다.
  • 두 개의 배열로 칸의 상태를 관리해 주었다.
  1. 각 칸의 불이 켜져있는지를 나타내는 배열 on (on[i] = true이면 칸 i가 켜져있는 상태)
  2. 각 칸에 도달 가능한지를 나타내는 배열 can (can[i] = true이면 칸 i로 이동 가능한 상태)
  • 이를 이용해서 아래의 프로세스를 갱신 가능한 요소가 없을 때까지 반복했다.
  1. 도달 가능한 모든 칸(can[i] = true인 곳)에서 간선을 한 번 타고 갈 수 있는 칸들의 불을 켠다.
  2. 불을 킨 칸들의 상하좌우에 인접한 곳도 불이 켜져있다면, 분리 집합으로 이어준다.
  3. 불이 켜져있고, 시작 칸(1,1)과 분리 집합 상에서 이어져있는 칸들을 can배열에서 모두 true로 바꿔준다.
  • 마지막에 불이 켜져있는(on[i] = true인) 칸의 개수를 출력해주었다.

⏳ 회고

  • 풀이를 총 세 번 갈아엎었다.
  • 처음에는 2차원 그대로 분리 집합 없이 깡 완탐으로 돌렸다가 틀렸다.
  • 두 번째 풀이는 2차원 그대로 분리 집합을 추가해서 풀었다가 틀렸다.
  • 다음으로, 1차원 압축 후 분리 집합으로 풀었는데 또 틀렸다.
  • 왜 틀렸는지 도저히 모르겠어서, 반례 게시판에서 반례 하나를 건져 왜 틀렸는지 분석했다.
  • 확실하진 않지만, 도달 가능한 칸 처리를 잘못 진행했던 것 같다.

@ShinHeeEul ShinHeeEul merged commit bc3ca2c into main Feb 12, 2025
1 check passed
@oncsr oncsr added hint 💡 반례를 참고했거나 힌트를 얻고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때 labels Feb 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

hint 💡 반례를 참고했거나 힌트를 얻고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants